/********************************************************************************
 *	模块名称 : BSP API 模块
 *	该模块不引用cpu底层头文件，
 *   应用程序通过此接口调用bsp封装可降低引用文件数，加快编译速度
 ********************************************************************************/
#ifndef _BSP_API_H_
#define _BSP_API_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "math.h"
#include "taskmanger.h"
#include "swiic.h"
#include "at24c.h"
#include "cmsis_os2.h"

#ifdef __cplusplus
extern "C"
{
#endif

	/*******************************************************************************
	 * init
	 *******************************************************************************/
	void bsp_Init(void);
	void bsp_Idle(void);

	/*******************************************************************************
	 * system msp stack, 仅用于用户堆栈和系统堆栈分离的OS，或者裸机程序
	 *******************************************************************************/
	void stack_init(void);
	uint16_t stack_used(void); // 千分数

	/*******************************************************************************
	 * port
	 *******************************************************************************/
	void bsp_qpi_port_init(void);
	void bsp_spim_port_init(void);

	/*******************************************************************************
	 * dwt
	 *******************************************************************************/
	void bsp_delay_init(void);
	void bsp_dwt_check(void);
	void bsp_delay_us(uint32_t us);
	void bsp_delay_ms(uint32_t ms);
	uint32_t bsp_cpu_clks_get(void);
	uint32_t bsp_clks_to_us(uint32_t clks);

	/*******************************************************************************
	 * delay
	 *******************************************************************************/
	void bsp_dly_init(void);
	void bsp_dly_ms(uint32_t ms);
	void bsp_dly_us(uint32_t us);

/*******************************************************************************
 * cpu
 *******************************************************************************/
#define cpu_data_sync() __DSB()
#define cpu_instruct_sync() __ISB()

	void wfi_set(void);

#define intx_alloc()
// 关闭所有中断(但是不包括fault和NMI中断)
#define intx_disable() __disable_irq()
// 开启所有中断
#define intx_enable() __enable_irq()

	void nvic_irq_set(uint32_t IRQn, uint32_t priority, uint8_t newst);
	int cpu_dbg_st_get(void);

	/*******************************************************************************
	 * uart - com
	 *******************************************************************************/
	void bsp_uart_init(void);

	/*******************************************************************************
	 * iic
	 *******************************************************************************/
	extern swiic_cfg_type bsp_sw_iic;
#define sw_iic &bsp_sw_iic
	void bsp_iic_send_only(char *dat, char len);
extern at24c_cfg_type at24_obj;

	/*******************************************************************************
	 * pwm
	 *******************************************************************************/
	void pwm_period_set(uint16_t period);
	void pwm_duty_set(char ch, uint16_t duty);

	/*******************************************************************************
	 * cap
	 *******************************************************************************/
	void cap_res_handle(void);
	uint16_t cap_period_get(void);
	uint16_t cap_duty_get(void);
	uint32_t cap_pulse_get(void);

	/*******************************************************************************
	 * app tick info opt
	 *******************************************************************************/
	uint32_t app_tick_init(uint32_t TickPriority);
	void app_tick_resume(void);
	void app_tick_suspend(void);
	uint32_t app_tick_get(void);
	uint32_t app_tick_us_get(void);
	void app_tick_duty_set(uint8_t ch, uint16_t duty);
	void app_timer_task_add(void (*task)(void));
	void app_timer_task_del(void (*task)(void));

	/*******************************************************************************
	 * adc
	 *******************************************************************************/
	void bsp_adc_init(void);
	void bsp_adc_val_handle(void);
	void bsp_tp_adc_init(void);

	/*******************************************************************************
	 * pwm
	 *******************************************************************************/
	uint32_t bsp_pwm_timer_init(void);
	void bsp_pwm_duty_set(char ch, uint16_t duty);

/*******************************************************************************
 * @brief   ENABLE
 *******************************************************************************/
#ifndef ENABLE
#define ENABLE 1
#define DISABLE 0
#endif

/*******************************************************************************
 * @brief   NOP
 *******************************************************************************/
#if defined(__ICCARM__)
#define __nop() asm("nop")
#define _nop_() asm("nop")
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#define _nop_ __builtin_arm_nop
#elif defined(__GNUC__)
#define _nop_() asm("nop")
#else
#define _nop_() __nop()
#endif

#define NOP1() _nop_()
#define NOP2() \
	NOP1();    \
	NOP1()
#define NOP3() \
	NOP2();    \
	NOP1()
#define NOP4() \
	NOP3();    \
	NOP1()
#define NOP5() \
	NOP4();    \
	NOP1()
#define NOP6() \
	NOP5();    \
	NOP1()
#define NOP7() \
	NOP6();    \
	NOP1()
#define NOP8() \
	NOP7();    \
	NOP1()
#define NOP9() \
	NOP8();    \
	NOP1()
#define NOP10() \
	NOP9();     \
	NOP1()
#define NOP11() \
	NOP10();    \
	NOP1()
#define NOP12() \
	NOP11();    \
	NOP1()
#define NOP13() \
	NOP12();    \
	NOP1()
#define NOP14() \
	NOP13();    \
	NOP1()
#define NOP15() \
	NOP14();    \
	NOP1()
#define NOP16() \
	NOP15();    \
	NOP1()
#define NOP17() \
	NOP16();    \
	NOP1()
#define NOP18() \
	NOP17();    \
	NOP1()
#define NOP19() \
	NOP18();    \
	NOP1()
#define NOP20() \
	NOP19();    \
	NOP1()
#define NOP21() \
	NOP20();    \
	NOP1()
#define NOP22() \
	NOP21();    \
	NOP1()
#define NOP23() \
	NOP22();    \
	NOP1()
#define NOP24() \
	NOP23();    \
	NOP1()
#define NOP25() \
	NOP24();    \
	NOP1()
#define NOP26() \
	NOP25();    \
	NOP1()
#define NOP27() \
	NOP26();    \
	NOP1()
#define NOP28() \
	NOP27();    \
	NOP1()
#define NOP29() \
	NOP28();    \
	NOP1()
#define NOP30() \
	NOP29();    \
	NOP1()
#define NOP31() \
	NOP30();    \
	NOP1()
#define NOP32() \
	NOP31();    \
	NOP1()
#define NOP33() \
	NOP32();    \
	NOP1()
#define NOP34() \
	NOP33();    \
	NOP1()
#define NOP35() \
	NOP34();    \
	NOP1()
#define NOP36() \
	NOP35();    \
	NOP1()
#define NOP37() \
	NOP36();    \
	NOP1()
#define NOP38() \
	NOP37();    \
	NOP1()
#define NOP39() \
	NOP38();    \
	NOP1()
#define NOP40() \
	NOP39();    \
	NOP1()
#define NOP(N) NOP##N()

#ifdef __cplusplus
}
#endif

#endif
